package com.sheng.leetcode.year2023.month11.day08;

import org.junit.Test;

/**
 * @author by ls
 * @date 2023/11/8
 * <p>
 * 2609. 最长平衡子字符串<p>
 * <p>
 * 给你一个仅由 0 和 1 组成的二进制字符串 s 。<p>
 * 如果子字符串中 所有的 0 都在 1 之前 且其中 0 的数量等于 1 的数量，则认为 s 的这个子字符串是平衡子字符串。请注意，空子字符串也视作平衡子字符串。<p>
 * 返回  s 中最长的平衡子字符串长度。<p>
 * 子字符串是字符串中的一个连续字符序列。<p>
 * <p>
 * 示例 1：<p>
 * 输入：s = "01000111"<p>
 * 输出：6<p>
 * 解释：最长的平衡子字符串是 "000111" ，长度为 6 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：s = "00111"<p>
 * 输出：4<p>
 * 解释：最长的平衡子字符串是 "0011" ，长度为  4 。<p>
 * <p>
 * 示例 3：<p>
 * 输入：s = "111"<p>
 * 输出：0<p>
 * 解释：除了空子字符串之外不存在其他平衡子字符串，所以答案为 0 。<p>
 * <p>
 * 提示：<p>
 * 1 <= s.length <= 50<p>
 * '0' <= s[i] <= '1'<p>
 */
public class LeetCode2609 {

    @Test
    public void test01() {
        String s = "01000111";
//        String s = "00111";
//        String s = "111";
        System.out.println(new Solution().findTheLongestBalancedSubstring(s));
    }
}

class Solution {
    public int findTheLongestBalancedSubstring(String s) {
        boolean flag = true;
        int ans = 0;
        int num1 = 0, num2 = 0;
        for (int i = 0; i < s.length(); i++) {
            if (flag && s.charAt(i) == '0') {
                num1++;
            } else if (flag && s.charAt(i) == '1') {
                num2++;
                flag = false;
            } else if (!flag && s.charAt(i) == '1') {
                num2++;
            } else if (!flag && s.charAt(i) == '0') {
                // 结束一轮 0/1 的计算
                flag = true;
                ans = Math.max(ans, Math.min(num1, num2) * 2);
                num1 = 1;
                num2 = 0;
            }
        }
        ans = Math.max(ans, Math.min(num1, num2) * 2);
        return ans;
    }
}
